<?php
/* vim: set expandtab tabstop=2 shiftwidth=2 softtabstop=2 textwidth=150 number: */

/**
 * Classe VeiculosController
 *
 * ...
 *
 * PHP versão 5
 *
 * LICENÇA: Este arquivo fonte esta sob o termos da licença MIT.
 *
 * @package   scuf.controller
 * @author    Rodrigo Casara <rodrigocasara@gmail.com>
 * @copyright 2012 Rodrigo Casara
 * @license   MIT License (http://www.opensource.org/licenses/mit-license.php)
 * @version   SVN: $Id$
 * @link
 * @since     SCUF(tm) v 1.0.0
 */

App::uses('AppController', 'Controller');
App::uses('File', 'Utility');

/**
 * Classe VeiculosController
 *
 * {@inheritdoc}
 */
class VeiculosController extends AppController {

  /**
   *
   */
  public $helpers = array('Paginator');

  /**
   * Descreva o método aqui ...
   */
  public function index() {
    $this->Veiculo->recursive = 0;
    $veiculos = $this->paginate('Veiculo', array('Veiculo.pessoa_id = ' . $this->Auth->user('id'))); // Somente os veículos do motorista.
    $this->set(compact('veiculos'));
  }

  /**
   * Descreva o método aqui ...
   * @throws BadRequestException
   */
  public function adicionar() {
    if ($this->request->is('post')) {
      if ($this->RequestHandler->isAjax()) {
        $this->autoRender = false;
        $resposta = array(
          'mensagem' => '',
          'sucesso' => false,
          'campos' => array(),
        );
        //
        $this->Veiculo->begin();
        if ($this->Veiculo->save($this->request->data)) {
          $this->Veiculo->commit();
          $resposta['mensagem'] = 'O cadastro do seu veículo foi realizado com sucesso.';
          $resposta['sucesso'] = true;
          // TODO: Cadastro realizado com sucesso, salvar mensagem na sessão e redirecionar para a tela de gerência. Exceto quando o formulário de
          // cadastro de veículo foi solicitado quando da tentativa de se registrar uma viagem ser possuir nenhum veículo cadastrado. Nesse caso
          // redirecionar para formulário de cadastro de viagem. A mensagem armazenada na sessão deve ser exibida depois do redirecionamento.
        } else {
          $this->Veiculo->rollback();
          if (!empty($this->Veiculo->validationErrors)) {
            $resposta['mensagem'] = 'Há campos obrigatórios que não foram preenchidos ou o valor informado é inválido.';
            $resposta['campos'] = $this->Veiculo->validationErrors;
            // Formata array com as mensagens de validação dos campos com erro. {{{
            $campos = array();
            $valores = array();
            foreach ($resposta['campos'] as $campo => $valor) {
              array_push($campos, "data[{$this->Veiculo->alias}][{$campo}]");
              array_push($valores, $valor[0]);
            }
            //}}}
            $resposta['campos'] = array_combine($campos, $valores);
          } else {
            $resposta['mensagem'] = 'Não foi possível salvar os dados do veículo.';
          }
        }
        echo json_encode($resposta);
      } else {
        throw new BadRequestException();
      }
    }
  }

  public function editar($id = null) {
    $this->Veiculo->id = $id;
    if ($this->request->is('get')) {
      $this->set('veiculo', $this->Veiculo->read());
    } elseif ($this->request->is('post')) {
      if ($this->RequestHandler->isAjax()) {
        $this->autoRender = false;
        $resposta = array(
          'mensagem' => '',
          'sucesso' => false,
          'campos' => array(),
        );
        //
        $this->Veiculo->begin();
        if ($this->Veiculo->save($this->request->data)) {
          $this->Veiculo->commit();
          $resposta['mensagem'] = 'O cadastro do seu veículo foi alterado com sucesso.';
          $resposta['sucesso'] = true;
        } else {
          $this->Veiculo->rollback();
          if (!empty($this->Veiculo->validationErrors)) {
            $resposta['mensagem'] = 'Há campos obrigatórios que não foram preenchidos ou o valor informado é inválido.';
            $resposta['campos'] = $this->Veiculo->validationErrors;
            // Formata array com as mensagens de validação dos campos com erro. {{{
            $campos = array();
            $valores = array();
            foreach ($resposta['campos'] as $campo => $valor) {
              array_push($campos, "data[{$this->Veiculo->alias}][{$campo}]");
              array_push($valores, $valor[0]);
            }
            //}}}
            $resposta['campos'] = array_combine($campos, $valores);
          } else {
            $resposta['mensagem'] = 'Não foi possível alterar os dados do veículo.';
          }
        }
        echo json_encode($resposta);
      } else {
        throw new BadRequestException();
      }
    }
  }

  public function visualizarFotografia($id = null) {
    $this->Veiculo->id = $id;
    if ($this->request->is('get')) {
      $this->autoRender = false;
      $this->request->data = $this->Veiculo->read();
      $caminhoArquivoLocal = $this->Veiculo->obterCaminhoAbsolutoFotografia();
      $arquivoFotografia = new File($caminhoArquivoLocal);
      $nomeArquivoDownload = String::uuid() . '.' . $arquivoFotografia->ext();
      $conteudoArquivo = $arquivoFotografia->read();
      if ($conteudoArquivo) {
        $this->response->header(array('Pragma: public',
                                      'Expires: 0',
                                      'Cache-Control: must-revalidate, post-check=0, pre-check=0',
                                      'Content-type: ' . $arquivoFotografia->mime(),
                                      'Content-Disposition: attachment; filename="' . $nomeArquivoDownload . '"',
                                      'Content-Transfer-Encoding: binary'));
        echo $conteudoArquivo;
      }
    }
  }

  /**
   * Excluir veículo.
   * @param integer $id Identificador do veículo.
   * @throws MethodNotAllowedException
   * @throws NotFoundException
   * @throws BadRequestException
   */
  public function excluir($id) {
    if (!$this->request->is('delete')) {
      throw new MethodNotAllowedException();
    }
    //
    $this->Veiculo->id = $id;
    if (!$this->Veiculo->exists()) {
      throw new NotFoundException('Veículo não encontrado.');
    }
    //
    if ($this->RequestHandler->isAjax()) {
      $this->autoRender = false;
      $resposta = array(
        'mensagem' => '',
        'sucesso' => false,
      );
      if (!$this->Veiculo->temViagensDivulgadas()) {
        $this->Veiculo->begin();
        if ($this->Veiculo->delete()) {
          $this->Veiculo->commit();
          $resposta['mensagem'] = 'Veículo excluído com sucesso.';
          $resposta['sucesso'] = true;
        } else {
          $this->Veiculo->rollback();
          $resposta['mensagem'] = 'Não foi possível excluir o veículo.';
        }
      } else {
        $resposta['mensagem'] = 'Não é possível excluir este veículo, pois ele possui viagens divulgadas.';
        $resposta['sucesso'] = false;
        $this->response->statusCode(500);
        $this->response->send();
        echo $resposta['mensagem'];
        return;
      }
      echo json_encode($resposta);
    } else {
      throw new BadRequestException();
    }
  }

}

?>